package demo.day13

import java.io.File

// Kotlin DSL学习
/**
 * DSL 领域专用与语言
 */
fun main() {
//
    /**
     * 其实apply5函数 就是DSL编程范式 定义输入输出的规则
     * 1.定义整个lambda规则标准，输入 必须是Context才有资格调用apply5这个函数，匿名函数里面持有it和this
     * 2.定义整个lambda规则标准，输出 始终返回Context本身
     * 然后main函数就可以根据DSL编程方式标准规则 来写具体的实现 这就是DSL编程范式
     */
    Context().apply5 {
        toast("success")
        toast(it)
        toast(info)
    }
    println("<===========================================>")
    val myContext = Context().apply6 {
        toast("success")
        toast(it)
        toast(info)
    }
    println(myContext)

    println("<===========================================>")
    val file = File("D:\\eula.1028.txt")
        .applyFile { fileName: String, data: String? ->
            println("你的名字为:$fileName,数据为：$data")
        }
//        .applyFile{a,b-> }
}

class Context {
    val info = "我就是Kiki"
    fun toast(str: String) {
        println(str)
    }
}

// 已经可以满足要求
private inline fun Context.apply5(lambda: Context.(String) -> Unit) {
    lambda(info)
}

// 更进一步 返回Context对象
private inline fun Context.apply6(lambda: Context.(String) -> Unit): Context {
    lambda(info)
    return this
}


private inline fun File.applyFile(lambdaAction: (String, String?) -> Unit): File {
    lambdaAction(name, readLines()[0])
    return this
}